package top.roadvast.network.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * @Author 郭泽鹏
 * @Date 2021/12/31 17:25
 * @Version 1.0
 * @Description
 *      TCP通信的客户端：向服务器发送连接请求，给服务器发送数据，读取服务器回写的数据
 *      表示客户端的类：
 *          java.net.Socket：此类实现客户端套接字（简称“套接字”），套接字是两台机器间通信的断点。
 *
 *      构造方法：
 *          Socket(String host, int port)：创建流套接字并将其连接到指定主机上的指定端口号。
 *          参数：
 *              String host：服务器主机的名称/服务器的IP地址
 *              int port：服务器的端口号
 *
 *        成员方法：
 *          OutputStream getOutputStream()
 *              返回此套接字的输出流。
 *          InputStream getInputStream()
 *              返回此套接字的输入流。
 *          void close()
 *              关闭此套接字。
 *        实现步骤：
 *          1.创建一个客户端对象Socket，构造方法绑定服务器的IP地址和端口号
 *          2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
 *          3.使用网络字节输出流OutputStream对象中的方法write，给服务器发送数据
 *          4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
 *          5.使用网络字节输入流InputStream对象中的方法read，读取服务器回写的数据
 *          6.释放资源（Socket）
 *        注意：
 *          1.客户端和服务器进行交互，必须使用Socket中提供的网络流，不能使用自己创建的流对象
 *          2.当我们创建客户端对象Socket的时候，就回去请求服务器和服务器经过3次握手建立连接通路
 *              这时如果服务器没有启动，那么就会抛出异常
 *              如果服务器已经启动，那么就可以进行交互了
 *
 */
public class TCPClient {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream outputStream = null;
        InputStream inputStream = null;
        try {
            socket = new Socket("127.0.0.1", 8083);
            outputStream = socket.getOutputStream();
            System.out.println("已连接到服务器.");
            while (true) {
                System.out.println("输入消息：");
                String data = new Scanner(System.in).nextLine();
                if ("exit".equalsIgnoreCase(data)) {
                    socket.shutdownOutput();        //终止输出
                    System.out.println("客户端退出，连接结束.");
                    break;
                }
                outputStream.write(data.getBytes());
                inputStream = socket.getInputStream();
                final byte[] response = new byte[1024];
                final int len = inputStream.read(response);
                System.out.println("接收到响应：" + new String(response, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
